From 51a28fa20bbd362d69d0465ee287bbf4f7f1e580 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Sun, 31 Aug 2014 23:15:11 -0700 Subject: [PATCH] Blow away corrupt database repos If a repository is corrupt, blow it away entirely and start from scratch instead of returning an error. --- src/cargo/sources/git/utils.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/cargo/sources/git/utils.rs b/src/cargo/sources/git/utils.rs index efea0c18e..5694e3dbd 100644 --- a/src/cargo/sources/git/utils.rs +++ b/src/cargo/sources/git/utils.rs @@ -145,16 +145,18 @@ impl GitRemote { } pub fn checkout(&self, into: &Path) -> CargoResult { - let repo = if into.exists() { - let r = try!(git2::Repository::open(into)); - try!(self.fetch_into(&r).chain_error(|| { - internal(format!("failed to fetch into {}", into.display())) - })); - r - } else { - try!(self.clone_into(into).chain_error(|| { - internal(format!("failed to clone into: {}", into.display())) - })) + let repo = match git2::Repository::open(into) { + Ok(repo) => { + try!(self.fetch_into(&repo).chain_error(|| { + internal(format!("failed to fetch into {}", into.display())) + })); + repo + } + Err(..) => { + try!(self.clone_into(into).chain_error(|| { + internal(format!("failed to clone into: {}", into.display())) + })) + } }; Ok(GitDatabase { remote: self.clone(), path: into.clone(), repo: repo }) @@ -181,6 +183,9 @@ impl GitRemote { fn clone_into(&self, dst: &Path) -> CargoResult { let url = self.url.to_string(); + if dst.exists() { + try!(rmdir_recursive(dst)); + } try!(mkdir_recursive(dst, UserDir)); let repo = try!(git2::build::RepoBuilder::new().bare(true) .hardlinks(false) -- 2.30.2